package business.global.pk.tdk;

import java.util.Random;

/**
 * 吹牛宏定义
 *
 * @author zaf
 **/
public class TDKdefine {

	/**
	 * 初始位置
	 */
	public final static int INIT_POS = 0;
	/**
	 * 初始最大分数玩家的位置
	 */
	public final static int INIT_MAX_POS = -1;

	// 3、4、5、6、2 移除
	public static Integer OutCard3T6A2List[] = {
			0x03, 0x04, 0x05, 0x06, 0x0F, // 方块3~2
			0x13, 0x14, 0x15, 0x16, 0x1F, // 梅花3~2
			0x23, 0x24, 0x25, 0x26, 0x2F, // 红桃3~2
			0x33, 0x34, 0x35, 0x36, 0x3F, // 黑桃3~2
	};

	// 3、4、5、6、7、2 移除
	public static Integer OutCard3T7A2List[] = {
			0x03, 0x04, 0x05, 0x06, 0x07, 0x0F, // 方块3~2
			0x13, 0x14, 0x15, 0x16, 0x17, 0x1F, // 梅花3~2
			0x23, 0x24, 0x25, 0x26, 0x27, 0x2F, // 红桃3~2
			0x33, 0x34, 0x35, 0x36, 0x37, 0x3F, // 黑桃3~2
	};

	// 3、4、5、6、7、8、2 移除
	public static Integer OutCard3T8A2List[] = {
			0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x0F, // 方块3~2
			0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x1F, // 梅花3~2
			0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x2F, // 红桃3~2
			0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x3F, // 黑桃3~2
	};



	// 3、4、5、6、7、8、9、2 移除
	public static Integer OutCard3T9A2List[] = {
			0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0F, // 方块3~2
			0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1F, // 梅花3~2
			0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2F, // 红桃3~2
			0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3F, // 黑桃3~2
	};

	// 3、4、5、6、7、8、9、10、2 移除
	public static Integer OutCard3T10A2List[] = {
			0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0F, // 方块3~2
			0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1F, // 梅花3~2
			0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2F, // 红桃3~2
			0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3F, // 黑桃3~2
	};

	public static Integer OutCardShuangWang[] = {
			0x41, 0x42 // 大小王
	};

	public static Integer OutCard2List[] = {
			0x0F, // 方块2
			0x1F, // 梅花2
			0x2F, // 红桃2
			0x3F, // 黑桃2
	};

	/**
	 * 吹牛牌值
	 *
	 * @author Administrator
	 */
	public enum TDK_CARD_VALUE {
		/**
		 * 牌值2
		 */
		C_2(15,2),
		/**
		 * 老A
		 */
		A(14, 15),
		/**
		 * 小王
		 */
		X(1, 14),
		/**
		 * 大王
		 */
		D(2, 16),;



		private int cardValue;
		private int value;

		TDK_CARD_VALUE(int cardValue, int value) {
			this.cardValue = cardValue;
			this.value = value;
		}

		public int cardValue() {
			return cardValue;
		}

		public int value() {
			return value;
		}

		public static int valueOf(int cardValue, boolean dai2Flag) {
			for (TDK_CARD_VALUE flow : TDK_CARD_VALUE.values()) {
				if (flow.cardValue == cardValue) {
					if(cardValue == 15 && dai2Flag){
						return 14;
					}else{
						return flow.value();
					}
				}
			}
			return cardValue;
		}

		public static int valueOf(int cardValue, TDK_CARD_TYPE type) {
			int value = 0;
			/*
			int value = cardValue;
			for (TDK_CARD_VALUE flow : TDK_CARD_VALUE.values()) {
				if (flow.cardValue == cardValue) {
					value = flow.value();
					break;
				}
			}
			*/
			if (TDK_CARD_TYPE.TDK_CARD_TYPE_WANG.equals(type)) {
				value = value+ 30;
			} else if (TDK_CARD_TYPE.TDK_CARD_TYPE_ZHADAN.equals(type)) {
				value = value+ 60;
			} else if (TDK_CARD_TYPE.TDK_CARD_TYPE_SAN.equals(type)) {
				value = value + 30;
			}
			return value;
		}

	}

	// 上分时间
	public enum TDK_SHANGFEN_TIME {

		SFSJ_60(60),

		SFSJ_120(120),

		SFSJ_180(180),

		SFSJ_240(240);
		private int value;

		TDK_SHANGFEN_TIME(int value) {
			this.value = value;
		}

		public int value() {
			return this.value;
		}
		public static TDK_SHANGFEN_TIME valueOf(int value) {
			for (TDK_SHANGFEN_TIME flow : TDK_SHANGFEN_TIME.values()) {
				if (flow.ordinal() == value) {
					return flow;
				}
			}
			return TDK_SHANGFEN_TIME.SFSJ_60;
		}
	}


	// 牌类型
	public enum TDK_CARD_TYPE {
		/**
		 * 默认状态
		 */
		TDK_CARD_TYPE_NOT(0),
		/**
		 * 三张
		 */
		TDK_CARD_TYPE_SAN(-1),
		/**
		 * 炸弹
		 */
		TDK_CARD_TYPE_ZHADAN(-2),
		/**
		 * 王炸
		 */
		TDK_CARD_TYPE_WANG(-3),;
		private int value;

		private TDK_CARD_TYPE(int value) {
			this.value = value;
		}

		public int value() {
			return this.value;
		}

		public static TDK_CARD_TYPE valueOf(int value) {
			for (TDK_CARD_TYPE flow : TDK_CARD_TYPE.values()) {
				if (flow.value == value) {
					return flow;
				}
			}
			return TDK_CARD_TYPE.TDK_CARD_TYPE_NOT;
		}

	}

	/**
	 * 计算类型
	 *
	 * @author Administrator
	 */
	public enum TDK_CALC_TYPE {
		/**
		 * 计算所有的私有牌
		 */
		TDK_CALC_ALL,
		/**
		 * 计算明牌
		 */
		TDK_CALC_MING,
		/**
		 * 计算第5张牌
		 */
		TDK_CALC_FIVE,;
	}

	/**
	 * 牌类型
	 */
	public enum TDK_PAISHU_TYPE {
		/**
		 * 5人，9-A
		 */
		PS_5_9TA,
		/**
		 *  5人，10-A
		 */
		PS_5_10TA,
		/**
		 * 7人，7-A
		 */
		PS_7_7TA,
		/**
		 * 7人，8-A
		 */
		PS_7_8TA,
		/**
		 * 7人，2-A
		 */
		PS_7_2TA,
		/**
		 * 4人，9-A
		 */
		PS_4_9TA,
		/**
		 * 4人，J-A
		 */
		PS_4_JTA,

	}

	/**
	 * 可选玩法
	 *
	 * @author Administrator
	 */
	public enum TDK_KEXUAN {

		/**
		 * 双王
		 */
		SHUANGWANG,
		/**
		 * 末脚踢服
		 */
		MOJIAOTIFU,

		/**
		 * 底一面四
		 */
		DIYIMIANSI,
		/**
		 * 带2
		 */
		DAI2

	}




	public enum TDK_XIANSHI_TYPE {
		/**
		 * 不限时
		 */
		NOT(0),
		/**
		 * 限时-15秒
		 */
		X_15(15),
		/**
		 * 限时-30秒
		 */
		X_30(30),
		/**
		 * 限时-60秒
		 */
		X_60(60),
		/**
		 * 限时-90秒
		 */
		X_90(90),
		/**
		 * 限时-120秒
		 */
		X_120(120);

		private int value;

		TDK_XIANSHI_TYPE(int value) {
			this.value = value;
		}

		public int value() {
			return this.value;
		}
		public static TDK_XIANSHI_TYPE valueOf(int value) {
			for (TDK_XIANSHI_TYPE flow : TDK_XIANSHI_TYPE.values()) {
				if (flow.ordinal() == value) {
					return flow;
				}
			}
			return TDK_XIANSHI_TYPE.NOT;
		}

	}

	/**
	 * 押注类型
	 *
	 * @author Administrator
	 */
	public enum TDK_DIFEN_TYPE {
		/**
		 * 1-2-3-4-5
		 */
		DF_1(1),
		/**
		 * 2-4-6-8-10
		 */
		DF_2(2),
		/**
		 * 3-6-9-12-15
		 */
		DF_3(3),
		/**
		 *4_8_12_16_20
		 */
		DF_4(4),
		/**
		 * 5-10-15-20-25
		 */
		DF_5(5),
		/**
		 * 10-20-30-40-50
		 */
		DF_10(10),
		;


		private int value;

		TDK_DIFEN_TYPE(int value) {
			this.value = value;
		}


		/**
		 * 检查押注值是否正确
		 *
		 * @param ordinal  开房时选择底分
		 * @param curValue 当前值
		 * @param value    押注值
		 * @return
		 */
		public static boolean checkValueOf1(int ordinal, int curValue, int value, int beishu) {
			TDK_DIFEN_TYPE difen= valueOf(Math.min(ordinal,5));
			if(TDK_DIFEN_TYPE.DF_10.equals(difen)){
				beishu=Math.max(Math.min(beishu,2),0);
			}else{
				beishu=Math.max(Math.min(beishu,3),0);
			}
			int firstChip=getFirstChipSet(ordinal,beishu);
			if(value==1*firstChip||value==2*firstChip||value==3*firstChip||value==4*firstChip||value==5*firstChip){
				return true;
			}else{
				return false;
			}
		}

		public static boolean checkValueOfSet(int ordinal, int curValue, int value, int beishu) {
			if(ordinal >= TDK_DIFEN_TYPE.DF_10.value){
				beishu=Math.max(Math.min(beishu,2),0);
			}else{
				beishu=Math.max(Math.min(beishu,3),0);
			}
			int firstChip=getFirstChipSet(ordinal,beishu);
			if(value==1*firstChip||value==2*firstChip||value==3*firstChip||value==4*firstChip||value==5*firstChip){
				return true;
			}else{
				return false;
			}
		}


		public static int getFirstChip1(int ordinal,int beishu) {
			TDK_DIFEN_TYPE difen= valueOf(Math.min(ordinal,5));
			if(TDK_DIFEN_TYPE.DF_1.equals(difen)){
				beishu=Math.max(Math.min(beishu,3),0);
			}else if(TDK_DIFEN_TYPE.DF_2.equals(difen) || TDK_DIFEN_TYPE.DF_3.equals(difen)){
				beishu=Math.max(Math.min(beishu,2),0);
			}else{
				beishu=Math.max(Math.min(beishu,1),0);
			}
			return difen.value*(int)Math.pow(2,beishu);
		}

		/**
		 * 自定义底分 pvc
		 * @param ordinal
		 * @param beishu
		 * @return
		 */
		public static int getFirstChipSet(int ordinal,int beishu) {
			if(TDK_DIFEN_TYPE.DF_1.value == ordinal){
				beishu=Math.max(Math.min(beishu,3),0);
			}else if(TDK_DIFEN_TYPE.DF_2.value == ordinal || TDK_DIFEN_TYPE.DF_3.value == ordinal){
				beishu=Math.max(Math.min(beishu,2),0);
			}else{
				beishu=Math.max(Math.min(beishu,1),0);
			}
			return ordinal*(int)Math.pow(2,beishu);
		}

		public static TDK_DIFEN_TYPE valueOf(int value) {
			for (TDK_DIFEN_TYPE flow : TDK_DIFEN_TYPE.values()) {
				if (flow.ordinal() == value) {
					return flow;
				}
			}
			return TDK_DIFEN_TYPE.DF_1;
		}
	}

	// 控牌动作
	public enum TDK_OP {
		/**
		 * 操作
		 */
		Not(0),
		/**
		 * 弃牌
		 */
		QiPai(1),
		/**
		 * 押注==>>应该是踢牌
		 */
		YaZhu(2),
		/**
		 * 跟注
		 */
		GenZhu(3),
		/**
		 * 开牌
		 */
		KaiPai(4),


		/**
		 * 踢
		 */
		Ti(5),

		/**
		 * 反踢
		 */
		FanTi(6),
		/**
		 * 不踢
		 */
		BuTi(7),


		;
		private int value;

		TDK_OP(int value) {
			this.value = value;
		}

		public int value() {
			return this.value;
		}

		public static TDK_OP valueOf(int value) {
			for (TDK_OP flow : TDK_OP.values()) {
				if (flow.value == value) {
					return flow;
				}
			}
			return TDK_OP.Not;
		}
	}

	;
}
